ডেটাবেজ তৈরি সংক্রান্ত ৬.৩ সেকশনটি পুরোপুরি ব্যাবহারিক। প্রোগ্রামিং করার ব্যবস্থা আছে (কম্পিউটারে কিংবা স্মার্টফোনে) শুধু সেরকম পরিবেশে পরের অংশটুকু শিক্ষার্থীর জন্য অর্থপূর্ণ বলে বিবেচিত হবে।
SQLite
এসকিউলাইট একটি ফ্রি ও ওপেন সোর্স ডেটাবেজ। ওয়েব, ডেস্কটপ ও মোবাইল অ্যাপ্লিকেশনে এই ডেটাবেজ ব্যবহার করা হয়। প্রচলিত অনেক ডেটাবেজের তুলনায় এর ব্যবহার অপেক্ষাকৃত সহজ বলে ডেটাবেজ শেখার জন্যও এটি বেশ জনপ্রিয়।
ইনস্টল করার প্রক্রিয়া
এসকিউলাইট-এরঅফিশিয়ালওয়েবসাইট (https://www.sqlite.org/download.html) থেকে এটি ডাউনলোড করা যাবে। ডাউনলোড করার পরে ইনস্টল করতে হবে। তাহলে কমান্ড লাইন অথবা টার্মিনাল থেকে বিভিন্ন কমান্ড দিয়ে এসকিউলাইট ব্যবহার করা যাবে। এছাড়া বেশ কিছু গ্রাফিক্যাল ইউজার ইন্টারফেস সমৃদ্ধ সফটওয়্যার রয়েছে যার মাধ্যমে এসকিউলাইট সহজে ব্যবহার করা যায়। যেমন - DB Browser for SQLite, SQLite Studio ইত্যাদি। ইন্টারনেট থেকে সফটওয়্যারগুলো বিনামূল্যে ডাউনলোড করা যাবে। এছাড়া অ্যান্ড্রয়েড অপারেটিং সিস্টেমচালিত মোবাইল ফোনেও এসকিউলাইট ইনস্টল করা থাকে। বিভিন্ন অ্যাপের মাধ্যমে এটি ব্যবহার করা যায়।
এসকিউলাইটে নতুন ডেটাবেজ তৈরি করতে হলে, টার্মিনাল চালু করে সেখানে কমান্ড লিখতে হবে sqlite 3 তারপর একটি স্পেস দিয়ে ডেটাবেজের নাম
$ sqlite3 school.db
আবার school.db ডেটাবেজ ইতোমধ্যে তৈরি করা হয়ে থাকলেও একই কমান্ড ব্যবহার করে এসকিউলাইট সফটওয়্যার চালু করতে হবে। সফটওয়্যার চালু হওয়ার পরে সেখানে বিভিন্ন কমান্ড দেওয়া যাবে। যেমন এসকিউলাইট বন্ধ করতে হলে লিখতে হবে . quit ।
sqlite> .quit
টেবিল তৈরি
স্কুলের ডেটাবেজে আমরা বিভিন্ন টেবিল তৈরি করব। প্রথমেই ধরা যাক শিক্ষার্থীর টেবিল। শিক্ষার্থীর টেবিলে কী কী তথ্য থাকতে পারে? (আমরা তথ্যগুলোর পাশে ব্র্যাকেটে ইংরেজি শব্দটিও লিখব যেন এসকিউলাইটে টেবিল তৈরির সময় আমরা সেটি ব্যবহার করতে পারি)।
কোন শাখার অন্তর্ভুক্ত (দিবা, বা প্রভাতি, কিংবা ক, খ, গ ইত্যাদি) (section) টেবিল তৈরি করার জন্য CREATE TABLE কুয়েরি ব্যবহার করতে হবে। এই কুয়েরি লেখার নিয়ম (সিনট্যাক্স / syntax) হচ্ছে এরকম—
CREATE TABLE table name (column name column type,
...);
এখানে table_name-এর জায়গায় যেই টেবিল তৈরি করা হবে, তার নাম লিখতে হবে। আর প্রথম বন্ধনীর ভেতরে প্রতিটি কলামের নাম ও একটি স্পেস দিয়ে সেই কলামের ডেটা টাইপ লিখতে হবে। আর একাধিক কলামের তথ্য কমা দিয়ে পৃথক করা থাকবে।
উপরে পরিকল্পিত student টেবিল তৈরি করতে হলে লিখতে হবে
CREATE TABLE student (name TEXT, class INTEGER, roll INTEGER, section TEXT) ;
কোনো টেবিল মুছে ফেলতে হলে DROP TABLE কুয়েরি ব্যবহার করতে হবে-
DROP TABLE [টেবিলের নাম];
যেমন— student টেবিলটি মুছে ফেলতে হলে লিখতে হবে,
DROP TABLE student;
এখন আবার CREATE TABLE কুয়েরি ব্যবহার করে টেবিলটি আবার তৈরি করা যাবে।
নোট : এসকিউএল ভাষার কমান্ডগুলো ইংরেজি বড়হাতের অক্ষরে বা ছোট হাতের অক্ষরে উভয়ভাবেই লেখা যায়। অর্থাৎ, CREATE বা create দুটিই একই কমান্ড বোঝায়। তবে, প্রচলিত রীতি হচ্ছে ইংরেজি বড় হাতের অক্ষর ব্যবহার করে লেখা।
টেবিলে ডেটা রাখা ও টেবিল থেকে ডেটা পড়া
কোনো টেবিলে ডেটা রাখতে চাইলে, INSERT কুয়েরি ব্যবহার করতে হবে। এই কুয়েরি লেখার নিয়ম হচ্ছে,
INSERT INTO টেবিলের নাম (প্রথম কলামের নাম, দ্বিতীয় কলামের নাম, তৃতীয় কলামের নাম ...) VALUES (প্রথম কলামের ডেটা, দ্বিতীয় কলামের ডেটা, তৃতীয় কলামের ডেটা ... );
যেমন— student টেবিলে Mizanur Rahman নামের একজন শিক্ষার্থী, যে কি না নবম শ্রেণির morning শাখায় পড়ে এবং রোল নম্বর 3, তার তথ্য রাখতে হলে নিচের মতো করে কুয়েরি লিখতে হবে—
INSERT INTO student (name, class, roll, section ) VALUES ('Mizanur Rahman', 9, 3, 'morning');
টেবিলে ডেটা ঠিকমতো রাখা হলো কি না, সেটি দেখার জন্য এখন টেবিলের ডেটা পড়া হবে। সেজন্য SELECT কুয়েরি লিখতে হবে। এই কুয়েরি লেখার নিয়ম হচ্ছে—
SELECT [কলামের নাম] কিংবা * FROM [টেবিলের নাম]; (একাধিক কলামের জন্য প্রতিটি কলামের নাম কমা দিয়ে পৃথক করে দিতে হবে SELECT FROM student ;
নোট : এসকিউলাইট কমান্ড লাইনে SELECT কুয়েরি-এর আউটপুট সুন্দর করে দেখতে চাইলে নিচের কমান্ড
দুটি আগে দিতে হবে,
sqlite> .mode column
sqlite> .headers on sqlite> select * from student;
আবার যদি শুধু নাম আর শ্রেণি দেখতে চাই, তাহলে লিখতে হবে—
sqlite> SELECT name, class FROM student;
পরবর্তী কিছু কাজের সুবিধার জন্য student টেবিলে আরো কিছু ডেটা রাখতে হবে।
INSERT INTO student (name, class, roll, section) VALUES
('Mosharraf Hossain', 9, 4, 1 morning ' );
INSERT INTO student (name, class, roll, section) VALUES
( ' David Pandey', 9, 2, 'morning ' ) ;
INSERT INTO student (name, class, roll, section) VALUES
( 'Promila Gosh 8, 2, ' day' ); INSERT INTO student (name, class, roll, section) VALUES
('Bazlur Rahman', 8, 1, 'day');
INSERT INTO student (name, class, roll, section) VALUES ('Sourav Das' 9, 1, 'day');
INSERT INTO student (name, class, roll, section ) VALUES
('Tamanna Nishat', 10, 1, 'morning');
INSERT INTO student (name, class, roll, section) VALUES
('Maysha', 10, 1, 'day' ) ;
এরকম কিছু ডেটা টেবিলে রাখার পরে আবার SELECT কুয়েরি ব্যবহার করে দেখতে হবে যে টেবিলে ডেটা আছে কি না। টার্মিনালে অনেক সময় কোনো ফিল্ডের নাম বেশি বড় হলে পুরোটা নাও দেখাতে পারে।
টেবিল থেকে ডেটা পড়া বা দেখার জন্য SELECT কুয়েরিতে বিভিন্ন শর্তও জুড়ে দেওয়া যায়। সেজন্য WHERE লিখে তারপরে শর্ত লিখতে হবে। নিচে বিভিন্ন উদাহরণ দেখানো হলো।
কেবল নবম শ্রেণির শিক্ষার্থীদের তথ্য দেখতে হলে লিখতে হবে
SELECT * FROM student WHERE class = 9;
এখানে শর্ত লেখা হয়েছে class = 9, অর্থাৎ class কলামের মান হতে হবে 9। SQL-এ দুটি মান তুলনা করার জন্য নিচের অপারেটরগুলো ব্যবহার করা হয়-
অপারেটর
=
সমান
বর্ণনা
<>
সমান নয়
>
>=
<
বড় কিংবা সমান (বামপক্ষ ডানপক্ষের চেয়ে বড় বা সমান)
ছোট (বামপক্ষ ডানপক্ষের চেয়ে ছোট)
বড় (বামপক্ষ ডানপক্ষের চেয়ে বড়)
ছোট কিংবা সমান (বামপক্ষ ডানপক্ষের চেয়ে ছোট বা সমান)
<=
আবার যেসব শিক্ষার্থী morning শাখার, তাদের তথ্য দেখতে হলে লিখতে হবে।
SELECT FROM student WHERE section = 'morning' ;
নোট : টেক্সট টাইপের ডেটা নিয়ে কাজ করার সময় শুরুতে ও শেষে কোটেশন চিহ্ন ( ' চিহ্ন) ব্যবহার করতে হবে। অর্থাৎ নিচের মতো কুয়েরি লিখলে হবে না ।
sqlite> SELECT FROM student WHERE section = morning ; Error: no such column: morning
একাধিক শর্ত একসঙ্গে জুড়ে দিতে চাইলে AND অথবা OR ব্যবহার করে কাজটি করা যায়। নবম শ্রেণি এবং morning শাখার শিক্ষার্থীদের তথ্য পেতে চাইলে লিখতে হবে-
SELECT * FROM student WHERE class ' morning' ; 9 AND section =
নবম শ্রেণি অথবা morning শাখার শিক্ষার্থীদের তথ্য পেতে চাইলে লিখতে হবে
SELECT * FROM student WHERE class = 9 OR section = 'morning' ;
নবম শ্রেণিতে পড়ে না এবং morning শাখার শিক্ষার্থীদের তথ্য দেখার জন্য নিচের কুয়েরি লিখতে হবে
SELECT * FROM student WHERE class < > 9 AND section
'morning ' ;
অষ্টম, নবম কিংবা দশম শ্রেণির শিক্ষার্থীদের তথ্য পাওয়ার জন্য কুয়েরি লিখতে হবে—
SELECT = 10; * FROM student WHERE class = 8 OR class = 9 OR class
=
উপরের কুয়েরিটি অন্যভাবেও লেখা যায়—
SELECT * FROM student WHERE class IN (8, 9, 10);
ডেটা মুছে ফেলা ও পরিবর্তন করা
ধরা যাক, student টেবিলে একটি নতুন রেকর্ড যোগ করা হলো—
INSERT INTO student (name, class, roll, section ) VALUES ('Fardeem Munir', 10, 1, 'day');
এখন টেবিলে day শাখার দশম শ্রেণির রোল নম্বর এক, এরকম দুইজন শিক্ষার্থী দেখা যাচ্ছে।
sqlite> SELECT name FROM student WHERE class = 10 AND roll 1 AND section = 'day' ;
Maysha Fardeem Munir
তাহলে নতুন যোগ করা রেকর্ডটি সঠিক নয়, কিংবা আগের রেকর্ডটি সঠিক নয়। নতুন রেকর্ডটি অর্থাৎ Fardeem Munir নামের শিক্ষার্থীর রেকর্ডটি মুছে ফেলতে হলে, DELETE কুয়েরি ব্যবহার করতে হবে। এটি লেখার নিয়ম হচ্ছে-
DELETE FROM [টেবিলের নাম] WHERE [শর্ত]
নিচের কুয়েরি চালালে Fardeem Munir-এর রেকর্ড মুছে যাবে
DELETE FROM student WHERE name
'Fardeem Munir';
তবে উপরের কুয়েরিটি চালালে student টেবিলে name কলামের যতগুলো রেকর্ড Fardeem Munir
হবে, সব রেকর্ড মুছে যাবে। তাই কোনো নির্দিষ্ট রেকর্ড মুছে ফেলার জন্য একটু সতর্কতা অবলম্বন করতে হয়। যেমন, এই কুয়েরিতে নামের সঙ্গে আরো শর্ত জুড়ে দেওয়া যায়—
DELETE FROM student WHERE name 'Fardeem Munir' AND class day' ;
10 AND roll = 1 AND section =
অনেক সময় কোনো রেকর্ড পরিবর্তন বা হালনাগাদ করার প্রয়োজন হয়। এই কাজটি করা যায় UPDATE কুয়েরি ব্যবহার করে। এই কুয়েরি লেখার নিয়ম হচ্ছে—
UPDATE [টেবিলের নাম] SET [কলামের নাম] = নতুন ডেটা (একাধিক কলাম হলে কমা দিয়ে তারপরে আবার [কলামের নাম] = নতুন ডেটা) WHERE [শর্ত]
ধরা যাক, ডেটাবেজে নিচের তথ্য রাখা হলো-
INSERT INTO student (name, class, roll, section ) VALUES ('Fardeem Munir', 1, 1, 'day');
তারপর দেখা গেল, Fardeem Munir আসলে দশম শ্রেণির শিক্ষার্থী এবং তার রোল নম্বর 3। তখন রেকর্ডটি মুছে না ফেলে আপডেট করা যায়।
UPDATE student SET class 'Fardeem Munir'; 10, roll
3 WHERE name
একাধিক টেবিল জয়েন করা
রিলেশনাল ডেটাবেজে ডেটা বিভিন্ন টেবিলে রাখা হয় এবং প্রয়োজন হলে একটি কুয়েরিতে একাধিক টেবিল থেকে ডেটা পড়া যায়। এই বিষয়টিকে বলে জয়েন (join) করা, যা রিলেশনাল ডেটাবেজের একটি গুরুত্বপূর্ণ বৈশিষ্ট্য।
ধরা যাক, student_info ও result নামে দুটি টেবিল তৈরি করা হলো।
CREATE TABLE student info (roll INTEGER, name TEXT; CREATE TABLE result (roll INTEGER, subject TEXT, marks REAL;
এই টেবিল দুটির মধ্যে roll কলাম দিয়ে একটি রিলেশন দেখা যাচ্ছে। student_info টেবিলে প্রতিটি শিক্ষার্থীর roll ও name রয়েছে। আবার result টেবিলে, শিক্ষার্থীর রোল নম্বর ও বিভিন্ন বিষয়ে পরীক্ষায় প্রাপ্ত নম্বর (marks) রয়েছে। student_info টেবিলের সঙ্গে result টেবিলের রিলেশন হচ্ছে ওয়ান টু মেনি রিলেশন।
এখন টেবিলে কিছু ডেটা ইনসার্ট করা হবে
INSERT INTO student info (roll, name) VALUES (1, 'Mizanur Rahman');
INSERT INTO student_info (roll, name) VALUES (10, 'Mosharraf
Hossain') ; INSERT INTO student_info (roll, name) VALUES (2, 'Maysha') ; INSERT INTO result (roll, subject, marks) VALUES (1,
'Bangla', 79.0) ; INSERT INTO result (roll, subject, marks) VALUES ( 1, 'English, 76.0) ;
INSERT INTO result (roll, subject, marks) VALUES ( 1, 'Mathematics', 74.0) ; INSERT INTO result (roll, subject, marks) VALUES ( 10,
'Bangla', 82.0) ;
INSERT INTO result (roll, subject, marks) VALUES (10, 'English', 70.0);
INSERT INTO result (roll, subject, marks) VALUES (10, 'Mathematics', 98.0);
INSERT INTO result (roll, subject, marks) VALUES (2,
'Bangla', 75.0);
INSERT INTO result (roll, subject, marks) VALUES (2,
'English', 80.0);
INSERT INTO result (roll, subject, marks) VALUES (2,
'Mathematics', 100.0);
রোল নম্বর 1 যে শিক্ষার্থীর, তার পরীক্ষার ফল জানতে নিচের কুয়েরিটি চালাতে হবে
SELECT roll, subject, marks FROM result WHERE roll = 1;
sqlite> SELECT roll, subject, marks FROM result WHERE roll =
1; roll
subject
marks
1 1
1
Bangla
79.0
76.0
74.0
English
Mathematics
এখন, রোল নম্বরের পাশাপাশি শিক্ষার্থীর নামও যদি দেখানোর প্রয়োজন হয়, তখন student_info টেবিলেও কুয়েরি করতে হবে, কারণ result টেবিলে তো শিক্ষার্থীর নাম নেই। কুয়েরিটি হবে এমন
sqlite> SELECT name, result.roll, subject, marks FROM result, student info WHERE result.roll 1 AND result.roll = =
student info.roll;
name
roll
1
1
1
subject
marks
Mizanur Rahman Mizanur Rahman
Bangla
79.0
76.0
Mizanur Rahman
English Mathematics
74.0
লক্ষ করতে হবে, কুয়েরিতে roll না লিখে result roll লেখা হয়েছে, কারণ roll নামের কলাম দুটি টেবিলেই আছে। আর কুয়েরির result.roll = student_info.roll অংশ দিয়ে টেবিল দুটি যুক্ত (join) করা হয়েছে। সব শিক্ষার্থীর তথ্য চাইলে result roll = 1 শর্তটি বাদ দিতে হবে। তখন কুয়েরিটি হবে এমন_
SELECT name, result.roll, subject, marks FROM result, student_info WHERE result.roll = student_info.roll;
সর্ট করা মানে হচ্ছে একটি নির্দিষ্ট ক্রমে সাজানো। এই ক্রমটি হতে পারে সংখ্যার ক্রম, নামের ক্রম বা অন্যকিছু। যেমন— আমরা শিক্ষার্থীদের তালিকা তৈরি করলে তাদেরকে সাজাতে পারি—নামের ক্রমানুসারে, শ্রেণির ক্রমানুসারে কিংবা রোল নম্বরের ক্রমানুসারে। আবার ছোট থেকে বড় ক্রমে যেমন সাজানো যায় (ইংরেজিতে একে বলা হয় Ascending Order), তেমনি বড় থেকে ছোট ক্রমেও সাজানো যায় (ইংরেজিতে একে বলে Descending Order)। সর্টিং করার জন্য কম্পিউটার বিজ্ঞানে বিভিন্ন ধরনের অ্যালগরিদম বা পদ্ধতি রয়েছে। কোনোটি সহজ, কোনোটি জটিল, কোনোটি বেশ দ্রুত গতির, আবার কোনোটি ধীর গতির। তবে ডেটাবেজে সর্টিং ব্যবহার করার সময় ডেটাবেজ সফটওয়্যার আসলে কীভাবে সর্টিংয়ের কাজটি করবে, তা নিয়ে মাথা ঘামাতে হয় না, বরং কীসের ভিত্তিতে সাজাতে হবে, আর কোন ক্রমে (ছোট থেকে বড়, নাকি বড় থেকে ছোট) সেটি বলে দিলেই হয়। সিলেক্ট কুয়েরির শেষে ORDER BY লিখে তারপরে কলামের নাম লিখলে সেই কলামের ডেটা অনুসারে ছোট থেকে বড় ক্রমে ডেটা আসবে। আর উল্টো ক্রমে (অর্থাৎ, বড় থেকে ছোট) ডেটা পেতে চাইলে শেষে DESC লিখতে হবে (Descending শব্দের প্রথম চারটি অক্ষর)।
student টেবিলে ডেটাগুলো বিভিন্নভাবে সাজানো যায়। নিচে কিছু উদাহরণ দেখানো হলো। শিক্ষার্থীদের প্রতিটি কুয়েরি নিজে নিজে এসকিউলাইটে চালিয়ে দেখার পরামর্শ দেওয়া হলো। শিক্ষার্থীদের শ্রেণি অনুসারে ছোট থেকে বড় ক্রমে সাজাতে চাইলে—
SELECT FROM student ORDER BY class;
শিক্ষার্থীদের শ্রেণি অনুসারে বড় থেকে ছোট ক্রমে সাজাতে চাইলে
SELECT * FROM student ORDER BY class DESC;
শিক্ষার্থীদের শ্রেণি অনুসারে বড় থেকে ছোট ক্রমে এবং একই শ্রেণির শিক্ষার্থীদের রোল নম্বর অনুযায়ী ছোট থেকে বড় ক্রমে সাজাতে চাইলে
SELECT * FROM student ORDER BY class DESC, roll;
শিক্ষার্থীদের শাখা অনুসারে ছোট থেকে বড় ক্রমে (day, morning-এর চাইতে ছোট, কারণ ইংরেজিতে d অক্ষরটি m-এর আগে আসে), একই শাখার শিক্ষার্থীদের শ্রেণি অনুসারে বড় থেকে ছোট, আর সবশেষে একই শ্রেণির শিক্ষার্থীদের রোল নম্বর অনুসারে ছোট থেকে বড় ক্রমে সাজাতে চাইলে –
SELECT * FROM student ORDER BY section, class DESC, roll;
নিজে কর : নিচের কুয়েরিটি চালালে কোন ক্রমে ডেটা পাওয়া যাবে? SELECT * FROM student ORDER BY class DESC, section, roll;
এসকিউএল একটি ডিক্লারেটিভ প্রোগ্রামিং ভাষা, এ কথা পূর্বেই বলা হয়েছে। এখানে কী করতে হবে, এটিই গুরুত্বপূর্ণ। কীভাবে করতে হবে, সেটি ডেটাবেজ সফটওয়্যারের দায়িত্ব। এখন, কোনো টেবিলে যখন অনেক অনেক বেশি ডেটা থাকে (যেমন— পাঁচ লক্ষ, দশ লক্ষ কিংবা আরো বেশি), তখন বিভিন্ন কুয়েরির গতি অনেক কমে যায়, অর্থাৎ কুয়েরি চলতে অনেক বেশি সময় লাগে। যেমন— একটি টেবিলে যদি এ বছরের মাধ্যমিক পরীক্ষায় ঢাকা বোর্ডের সব শিক্ষার্থীর ডেটা থাকে, তাহলে সেই টেবিলে পাঁচ থেকে দশ লক্ষের মতো রেকর্ড বা রো থাকবে। এখন যদি সেখান থেকে নাম কিংবা রোল নম্বর (বা রেজিস্ট্রেশন নম্বর) দিয়ে একজন শিক্ষার্থীর তথ্য বের করার চেষ্টা করা হয়, তাহলে সেই কুয়েরি চলতে বেশ সময় লাগবে। কারণ তখন লিনিয়ার সার্চের মাধ্যমে এক এক করে সবার তথ্য পরীক্ষা করা হবে এবং যাদের সঙ্গে মিল পাওয়া যাবে, তাদের তথ্য দেখানো হবে। লিনিয়ার সার্চ কীভাবে কাজ করে সেটি আগের অধ্যায়ে আলোচনা করা হয়েছে। টেবিলে যত বেশি রেকর্ড থাকবে, তত বেশি সময় লাগবে।
ইনডেক্সিং হচ্ছে একটি বিশেষ পদ্ধতি, যার মাধ্যমে ডেটা সহজে ও দ্রুত খুঁজে পাওয়া যায়। যেমন— ডিকশনারি বা অভিধান ব্যবহার করার সময় কোনো শব্দ খুঁজতে কিন্তু বেশি সময় লাগে না। কারণ শব্দগুলো একটি ক্রমে সাজানো থাকে, এবং অভিধানের কোনো পাতা খুললে কাঙ্ক্ষিত শব্দটি ওই পাতায়, নাকি তার আগে না পরে আছে, সেটি সহজেই বোঝা যায়। ডেটা যদি সর্ট করা থাকে তাহলে বাইনারি সার্চ ব্যবহার করে খুব দ্রুতে খুঁজে পাওয়া যায়। তেমনি কোনো বিশেষ কলামের উপর ইনডেক্স তৈরি করলে সেই কলামের মান দিয়ে ডেটা খুঁজলে ডেটাবেজ সফটওয়্যার খুব দ্রুত সেটি বের করে দিতে পারে। ডেটাবেজ কীভাবে ইনডেক্স তৈরি করার কাজটি করবে, সেটি ব্যবহারকারীর জানতে হয় না, কেবল কোন কলামের উপর ইনডেক্স তৈরি করতে হবে, সেটি বলে দিতে হয়। প্রয়োজন হলে একাধিক কলামের উপরও ইনডেক্স তৈরি করা যায়।
ইনডেক্স তৈরির কুয়েরি লেখার নিয়ম হচ্ছে—
CREATE INDEX [ইনডেক্সের নাম] ON [টেবিলের নাম] ([কলামের নাম], একাধিক কলামের ক্ষেত্রে নামগুলো কমা দিয়ে পৃথক করা থাকতে হবে);
যেমন— class কলামের উপর ইনডেক্স তৈরি করতে চাইলে নিচের কুয়েরি লিখতে হবে
CREATE INDEX student_class_idx ON student (class ) ;
ইনডেক্স তৈরি করলে কলামের উপর নির্ভর করে ডেটা খুঁজে পেতে যেমন সহজ হয়, তেমনি যেই কলামের উপর ইনডেক্স করা হয়েছে, সেটি অনুসারে সর্ট করলেও সর্ট করার কাজটি দ্রুত হয়। উপরের ইনডেক্স তৈরি করার ফলে SELECT * FROM student ORDER BY class; কুয়েরিটি অনেক দ্রুত কাজ করবে।
আবার অনেক সময় অনন্য (unique) ইনডেক্স তৈরি করা যায়, যেন একই ডেটা ডেটাবেজে একাধিকবার না ঢোকে। যেমন— নিচের ইনডেক্স তৈরি করা হলে student টেবিলে একই শাখার একই ক্লাসের একই রোল নম্বরের কেবল একজন শিক্ষার্থী থাকবে-
CREATE UNIQUE INDEX unique_student_idx ON student (section, class, roll) ;
কাজটি টেবিল তৈরি করার পরে যে কোনো সময় করা যায়। এমনকি টেবিলে ডেটা রাখার পরেও করা যায়। আবার টেবিল তৈরি করার সময়ও এক বা একাধিক ফিল্ডকে ইউনিক ঘোষণা করা যায়।
দশম শ্রেণির day শাখার রোল নম্বর 1 ইতোমধ্যে student টেবিলে আছে। এখন যদি এরকম আরেকটি ডেটা রাখার চেষ্টা করা হয়, তাহলে ডেটাবেজ সেটি হতে দেবে না। ইতিপূর্বে একটি উদাহরণে দেখানো হয়েছিল যে একই ক্লাসের একই রোল নম্বরে দুজন শিক্ষার্থীর ডেটা টেবিলে ঢুকে গিয়েছে। ইউনিক ইনডেক্স ব্যবহার করলে বিষয়টি এড়ানো যায়।
sqlite > INSERT INTO student (name, class, roll, section) VALUES ( ' Maysha', 10, 1, ' day' ) ; Error: UNIQUE constraint failed: student.section, student.class, student.roll
উল্লেখ্য যে, কোনো টেবিলে কোনো কলামকে প্রাইমারি কি হিসেবে ঘোষণা করলে ডেটাবেজ আপনা-আপনি ওই কলামের উপর ইনডেক্স তৈরি করে নেয়, আলাদাভাবে ইনডেক্স তৈরি করার প্রয়োজন হয় না।
ডেটাবেজে ইনডেক্স তৈরির বিভিন্ন সুবিধার পাশাপাশি কিছু অসুবিধাও আছে। প্রথমত, ইনডেক্স তৈরির পরে সেই টেবিলে কোনো নতুন ডেটা যোগ করা, মুছে ফেলা বা পরিবর্তন করা হলে ইনডেক্স যেখানে তৈরি করা হয়েছে, সেখানেও পরিবর্তন হয়। কাজটি ডেটাবেজ নিজেই করে, তবে এর ফলে INSERT, UPDATE, DELETE কুয়েরি চলতে আগের চেয়ে বেশি সময় লাগে। এছাড়া ইনডেক্স তৈরি করতে অতিরিক্ত জায়গার প্রয়োজন হয়, অর্থাৎ হার্ড ডিস্কের অতিরিক্ত জায়গা খরচ হয়।
কোনো ইনডেক্স মুছে ফেলতে হলে DROP INDEX লিখে তারপরে ইনডেক্সের নাম লিখতে হবে। যেমন—
DROP INDEX student class idx;
Read more